package com.hnkywl.sts.service.organ;

import com.google.gson.Gson;
import com.hnkywl.sts.dao.organ.GsjgDao;
import com.hnkywl.sts.dao.organ.NbgsDao;
import com.hnkywl.sts.entity.organ.Nbgs;
import com.hnkywl.sts.service.base.BmService;
import com.hnkywl.sts.util.BaseUtils;
import com.hnkywl.sts.util.ReflectionUtils;
import net.ruixin.orm.hibernate.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 说明：
 * 包:        com.hnkywl.sts.service.sys
 * 类描述:    岗位服务类
 * 修改备注: [说明本次修改内容]
 * 版本:        [v1.0]
 */
@Service
public class NbgsService {
    private NbgsDao nbgsDao;
    private GsjgDao gsjgDao;
    private BmService bmService;

    /**
     * 查询内部公司
     *
     * @param mc       内部公司机构名称
     * @param pageNo
     * @param pageSize
     * @return
     */
    @Transactional
    public String findAllNbgs(Long id, String mc, Long parentId, String parentMc, int pageNo, int pageSize) {
        Page<Nbgs> nbgsPage = this.nbgsDao.findNbgsList(id, mc, parentId, parentMc, pageNo, pageSize);
        String nbgsJson = BaseUtils.fetchCollectionToJson(nbgsPage.getResult() == null ? new ArrayList<Nbgs>() : nbgsPage.getResult(),
                "id", "qc", "jc", "sjjg.jc", "bz", "zpme", "qyfr.qyqc", "bgdz", "sfzx");
        return "{\"total\":" + nbgsPage.getTotalCount() + ",\"rows\":[" + nbgsJson + "]}";
    }

    @Transactional
    public String findAllNbgsMc(Long id, String mc, Long parentId, String parentMc, int pageNo, int pageSize) {
        Page<Nbgs> nbgsPage = this.nbgsDao.findNbgsList(id, mc, parentId, parentMc, pageNo, pageSize);
        String nbgsJson = BaseUtils.fetchCollectionToJson(nbgsPage.getResult() == null ? new ArrayList<Nbgs>() : nbgsPage.getResult(),
                "id", "qc", "jc");
        return "[" + nbgsJson + "]";
    }

    @Transactional
    public String findAllNbgs() {
        Gson gson = new Gson();
        List<Nbgs> nbgsList = this.nbgsDao.findNbgsList();
        String nbgsJson = gson.toJson(nbgsList);
        return nbgsJson;
    }


    @Transactional
    public  List<Nbgs> findAllNbgsList() {
        List<Nbgs> nbgsList = this.nbgsDao.findNbgs();
       return  nbgsList;
    }

    /**
     * 查询内部公司明细
     *
     * @param id 内部公司ID
     * @return
     */
    @Transactional
    public Nbgs findNbgsDetail(Long id) {
        return this.nbgsDao.get(id);
    }

    /**
     * 公司机构树形展示,未启用则不展示
     *
     * @param id 树节点Id
     */
    public String findNbgsTree(Long id) {
        List<Map> nbgsList = new ArrayList<Map>();
        nbgsList.addAll(nbgsDao.findAllNbgs(id));
        return new Gson().toJson(nbgsList);
    }

    /**
     * 保存内部公司
     *
     * @param
     * @return
     */
    @Transactional
    public void saveNbgs(Nbgs nbgs) {
        String  bm = this.getNbgsbm();
        nbgs.setBm(bm);
        nullId(nbgs);
        if (nbgsDao.checkUnique(nbgs.getId(), nbgs.getQc(), "qc")) {
            throw new RuntimeException("公司机构全称不能重复！");
        }
        if (nbgsDao.checkUnique(nbgs.getId(), nbgs.getJc(), "jc")) {
            throw new RuntimeException("公司机构简称不能重复！");
        }
//        if (nbgsDao.checkUnique(nbgs.getId(), nbgs.getPxh(), "pxh")) {
//            throw new RuntimeException("公司排序号不能重复！");
//        }
        nbgs.setSfzx(!nbgs.getSfzx());
        nbgs.setSfxyjz(!nbgs.getSfxyjz());
        nbgs.setDateCreated(new Date());
        nbgs.setLastUpdated(nbgs.getDateCreated());
        this.nbgsDao.save(nbgs);
    }

    public Nbgs findByJc(String jc) {
        return this.nbgsDao.findUniqueByProperty("jc", jc);
    }

    //内部公司编码
    public String getNbgsbm() {
        return bmService.getJgbm();
    }

    /**
     * 更新内部公司
     *
     * @param nbgs 内部公司
     * @return
     */
    @Transactional
    public void updateNbgs(Nbgs nbgs) throws RuntimeException {
        nullId(nbgs);
        if (nbgsDao.checkUnique(nbgs.getId(), nbgs.getQc(), "qc")) {
            throw new RuntimeException("公司机构全称不能重复！");
        }
        if (nbgsDao.checkUnique(nbgs.getId(), nbgs.getJc(), "jc")) {
            throw new RuntimeException("公司机构简称不能重复！");
        }
//        if (nbgsDao.checkUnique(nbgs.getId(), nbgs.getPxh(), "pxh")) {
//            throw new RuntimeException("公司排序号不能重复！");
//        }
        nbgs.setSfzx(!nbgs.getSfzx());
        nbgs.setSfxyjz(!nbgs.getSfxyjz());
        Nbgs n = nbgsDao.get(nbgs.getId());
        n = (Nbgs) ReflectionUtils.getInstance(n, nbgs);
        n.setLastUpdated(new Date());
        this.nbgsDao.save(n);
    }

    /**
     * 删除内部公司
     *
     * @param id 内部公司ID
     * @return
     */
    @Transactional
    public void deleteNbgs(Long id) {
        Nbgs nbgs = nbgsDao.get(id);
        nbgs.setLastUpdated(new Date());
        nbgs.setDeleted(1);
        this.nbgsDao.save(nbgs);
    }

    /**
     * 查询所有内部公司根据内部公司ID
     *
     * @param id 内部公司ID
     * @return
     */
    @Transactional
    public List<Long> findAllNbgsById(Long id, List<Long> nbgsIds) {
        nbgsIds.add(id);
        List<Nbgs> nbgsList = nbgsDao.find("from Nbgs where sjjg.id = ? order by pxh asc", id);
        if (nbgsList.size() > 0) {
            for (Nbgs nbgs : nbgsList) {
                findAllNbgsById(nbgs.getId(), nbgsIds);
            }
        }
        return nbgsIds;
    }

    private void nullId(Nbgs nbgs) {
        if (nbgs != null && nbgs.getYjg() != null && nbgs.getYjg().getId() == null)
            nbgs.setYjg(null);
        if (nbgs != null && nbgs.getSjjg() != null && nbgs.getSjjg().getId() == null)
            nbgs.setSjjg(null);
        if (nbgs != null && nbgs.getCwrj() != null && nbgs.getCwrj().getId() == null)
            nbgs.setCwrj(null);
        if (nbgs != null && nbgs.getSkrj() != null && nbgs.getSkrj().getId() == null)
            nbgs.setSkrj(null);
        if (nbgs != null && nbgs.getQyfr() != null && nbgs.getQyfr().getId() == null)
            nbgs.setQyfr(null);
    }

    /**
     * 获取总公司
     *
     * @return
     */
    public List<Nbgs> findAllRootNbgs() {
        return nbgsDao.findAllRootNbgs();
    }

    @Autowired
    public void setNbgsDao(NbgsDao nbgsDao) {
        this.nbgsDao = nbgsDao;
    }

    @Autowired
    public void setGsjgDao(GsjgDao gsjgDao) {
        this.gsjgDao = gsjgDao;
    }

    @Autowired
    public void setBmService(BmService bmService) {
        this.bmService = bmService;
    }
}
